package com.hyz.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.hyz.mapper.RightsMapper;
import com.hyz.mapper.UserMapper;
import com.hyz.pojo.LoginUser;
import com.hyz.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @author HGD
 * @date 2022/9/15 12:03
 * 在数据库中找到对应的用户数据
 */
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    /*
     * 我们从前端获取到的用户名和密码之后，需要从数据库中根据用户名获取对应的用户数据
     * 而在 spring security 中，获取用户数据是通过 InMemoryUserDetailsManager 这个实现类来完成的
     * 而 InMemoryUserDetailsManager 这个实现类是实现了 UserDetailsManager 这个接口
     * UserDetailsManager 这个接口是继承自 UserDetailsService 这个接口。
     * 我们可以通过实现 UserDetailsService 这个接口来是实现根据用户名到数据库中获取对应用户数据的这个功能
     */

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RightsMapper rightsMapper;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 1.根据用户名在数据库中获取对应的用户数据
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getUsername, username);
        User user = userMapper.selectOne(lambdaQueryWrapper);
        if (Objects.isNull(user)) {
            throw new RuntimeException("用户名错误");
        }
        // 2.通过用户信息查询用户权限
        List<String> perms = rightsMapper.selectPermsByUserId(String.valueOf(user.getId()));
//        List<String> perms= new ArrayList<>(Collections.singletonList("right"));
        // 3.返回 UserDetails
        return new LoginUser(user, perms);
    }
}
